import { rstest } from "@rstest/core";
import { letTimeout, varTimeout } from "./var-timeout.mjs";

describe("varTimeout", () => {
  /**
   * @type {ReturnType<(typeof import("@rstest/core").rstest)['spyOn']>}
   */
  let consoleSpy;
  beforeEach(() => {
    // mockImplementation 防止输入到控制台
    consoleSpy = rstest.spyOn(console, "log").mockImplementation(() => {});
  });
  // 测试结束后恢复真定时器
  afterAll(() => {
    rstest.useRealTimers();
  });
  it("varTimeout 应该调用 console.log 3 次，每次都输出 3", () => {
    rstest.useFakeTimers();

    varTimeout();

    // 立即执行所有定时器
    rstest.runAllTimers();

    // 验证调用次数和参数
    expect(consoleSpy).toHaveBeenCalledTimes(3);
    expect(consoleSpy).toHaveBeenNthCalledWith(1, 3);
    expect(consoleSpy).toHaveBeenNthCalledWith(2, 3);
    expect(consoleSpy).toHaveBeenNthCalledWith(3, 3);

    // 清理 spy
    consoleSpy.mockRestore();
  });
  it("letTimeout 应该调用 console.log 3 次，每次都输出 0 1 2", () => {
    rstest.useFakeTimers();

    letTimeout();

    // 立即执行所有定时器
    rstest.runAllTimers();

    // 验证调用次数和参数
    expect(consoleSpy).toHaveBeenCalledTimes(3);
    expect(consoleSpy).toHaveBeenNthCalledWith(1, 0);
    expect(consoleSpy).toHaveBeenNthCalledWith(2, 1);
    expect(consoleSpy).toHaveBeenNthCalledWith(3, 2);

    // 清理 spy
    consoleSpy.mockRestore();
  });
});
